package view;

import java.util.ArrayList;
import java.util.List;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Scanner;


import model.Aluno;
import model.Disciplina;
import model.Professor;
import model.Turma;
import model.dao.AlunoDaoImpl;
import model.dao.DisciplinaDaoImpl;
import model.dao.ProfessorDaoImpl;
import model.dao.TurmaDaoImpl;

public class AdministradorView {
	public void Adm(AlunoDaoImpl a, ProfessorDaoImpl b, TurmaDaoImpl c, DisciplinaDaoImpl d) throws FileNotFoundException, IOException  {

		int op;
		int cont;
		int contTurmas;
		int contDisciplina;
		int profId;
		String nome;
		String cpf;
		String id; 
		List<Integer> listaIdProfessores = new ArrayList<Integer>();

	 	List<Disciplina> listaDisciplinas = new ArrayList<Disciplina>();
	 	List<Professor> listaProfessores = new ArrayList<Professor>();
	 	List<Turma> listaTurma = new ArrayList<Turma>();
		
		Scanner scan = new Scanner(System.in);	
		
		do {
	    	System.out.println( "1 - Cadastrar Alunos\n" +  
	    						"2 - Cadastrar Professores\n" +  
	    						"3 - Cadastrar Turmas\n" + 
	    						"4 - Cadastrar Disciplinas\n" +  
	    						"5 - Cadastrar Alunos na Turma\n" +  
	    						"6 - Listar numero de turmas para uma disciplina\n" + 
	    						"7 - Listar numero de disciplinas para um professor\n" + 
	    						"8 - Sair\n");  
	    	System.out.println("Informe a opcao: ");  
	    	String opcao = scan.nextLine();
	
	    	op = Integer.parseInt(opcao);
	    	switch (op) {  
	    	case 1:
	    		System.out.println("Informe o nome: ");  
	    		nome = scan.nextLine();
	    		System.out.println("Informe o CPF: ");  
	    		cpf = scan.nextLine();
	    		a.cadastrar(nome, cpf);
	    		a.salvar("aluno.txt", true);
	    		break;  
	    	case 2:  
	    		System.out.println("Informe o nome: ");  
	    		nome = scan.nextLine();
	    		System.out.println("Informe o CPF: ");  
	    		cpf = scan.nextLine();
	    		System.out.println("Informe o departamento: ");  
	    		String departamento = scan.nextLine();
	    		b.cadastrar(nome, cpf, departamento);
	    		b.salvar("professor.txt", true);
	    		break;
	    	case 3:
	    		listaDisciplinas = d.getListaDisciplinas();
	    		cont = 0;
	    		for (Disciplina disciplina: listaDisciplinas){
	    			System.out.println(cont+1 + " - Nome: " + disciplina.getNome() +"\tEmenta: " + disciplina.getEmenta());
	    			cont ++;
	    		}
	    		System.out.println("\nInforme o numero da Disciplina: ");
	    		id = scan.nextLine();
	    		int discId = (Integer.parseInt(id)) - 1;
	    		if ((discId < 0) || (discId > listaDisciplinas.size())){
	    			System.out.println("Numero incorreto.");
	    			break;
	    		}
	    		int opcao2 = 0;
	    		int teste = 0;
	    		do{
	    			listaProfessores = b.getListaProfessores();
	    			cont = 0;
	    			for (Professor professor: listaProfessores){
	    				if (listaIdProfessores.size() != 0){
	    					for (int num: listaIdProfessores){
	    						if (num == cont){
	    							teste = 1;
	    						}
	    					}
	    					if (teste == 0){
	    						System.out.println(cont+1 + " - Nome: " + professor.getNome() +"\tDepartamento: " + professor.getDepartamento());
	    					}
	    				}
	    				else{
	    					System.out.println(cont+1 + " - Nome: " + professor.getNome() +"\tDepartamento: " + professor.getDepartamento());
	    				}
	    			cont++;
	    			teste = 0;
	    			}
	    			System.out.println("\nInforme o numero do Professor: ");
	    			id = scan.nextLine();
	    			profId = (Integer.parseInt(id)) - 1;	   
	    			if ((profId < 0) || (profId >listaProfessores.size())){
	    				System.out.println("Numero incorreto.");
	    				break;
	    			}
	    			listaIdProfessores.add(profId);
	    			if (listaIdProfessores.size() != listaProfessores.size()){
	    				System.out.println("Deseja adicionar outro professor? \n");
	    				System.out.println("0 - Nao\n");
	    				System.out.println("1 - Sim\n");
	    				System.out.println("Digite a opcao: \n");
	    				String op2 = scan.nextLine();	
	    				opcao2 = Integer.parseInt(op2);
	    			}
	    			else{
	    				opcao2 = 0;
	    				System.out.println("Não existem mais professores a serem cadastrados");
	    			}
	    		}while(opcao2 != 0);
	    		System.out.println("Informe o ano: ");  
	    		String ano = scan.nextLine();
	    		int ano1 = Integer.parseInt(ano); 
	    		System.out.println("Informe o periodo: ");  
	    		String periodo = scan.nextLine();
	    		System.out.println("Informe o local: ");  
	    		String local = scan.nextLine();
	    		System.out.println("Informe o horario: ");  
	    		String horario = scan.nextLine();
	    		System.out.println("Informe o numero de vagas: ");  
	    		String numeroVagas = scan.nextLine();
	    		int numeroVagas1 = Integer.parseInt(numeroVagas);
	    		c.cadastrar(ano1, periodo, local, horario, numeroVagas1, listaIdProfessores, discId);
	    		c.salvar("turma.txt", true);
	    		break;
	    	case 4:  
	    		System.out.println("Informe o nome: ");  
	    		nome = scan.nextLine();
	    		System.out.println("Informe a ementa: ");  
	    		String ementa = scan.nextLine();
	    		System.out.println("Informe a carga horaria: ");  
	    		String cargaHoraria = scan.nextLine();
	    		int cargaHoraria1 = Integer.parseInt(cargaHoraria);
	    		d.cadastrar(nome, ementa, cargaHoraria1);
	    		d.salvar("disciplina.txt", true);
	    		break;
	    	case 5:
	    		teste = 0;		    		
   		   		listaTurma = new ArrayList <Turma>();
	    		listaTurma = c.getlistaTurmas();
	    		cont = 0;
	    		System.out.println("Informe a turma para cadastrar: "); 
	    		for (Turma turma: listaTurma){
	    			System.out.println(cont+1 + " - " +" Ano: "+ turma.getAno() +" Periodo: "+turma.getPeriodo()+" Local: "+turma.getLocal()+" Horario: "+turma.getHorario()+" Numero de vagas: " +turma.getNumeroVagas() +"\n");
	    			cont ++;
	    		}
	    		
	    		id = scan.nextLine();
	    		int turmaId = (Integer.parseInt(id)) - 1;
	    		List<Aluno> listaAlunos = new ArrayList <Aluno>();
	    		listaAlunos = a.getlistaAlunos();
	    		List<Integer> listaIdAlunos = c.getlistaIdAlunos();
	    		do{
	    			cont = 0;   
	  	    		for (Aluno aluno: listaAlunos){
	  	    			if(listaIdAlunos.size() != 0){
	  	    				for (int num: listaIdAlunos){
	  	    					if (num == cont){
	  	    						teste = 1;
	  	    					}
	  	    				}
	  	    				if (teste == 0 ){
	  	    					System.out.println(cont+1 +" - "+"Nome: "+ aluno.getNome() +" CPF: " +aluno.getCpf()+"; \n");	  	    	
	  	    				}
	  	    			}
	  	    			else {
	  	    				System.out.println(cont+1 +" - "+"Nome: "+ aluno.getNome() +" CPF: " +aluno.getCpf()+"; \n");  	    					
	  	    			}
	  	    			cont ++;
	  	    			teste = 0;
	  	    		}
		  	    	System.out.println("Informe o aluno para cadastrar: \n");
		  	    	id = scan.nextLine();
		    		int alunoId = (Integer.parseInt(id)) - 1;
		    		if ((alunoId < 0) || (alunoId > listaAlunos.size())){
		    			System.out.println("Numero incorreto.");
		   			}
		   			else {
		   				int flag = 1;
		   				for (int i : listaIdAlunos) {
	    					if (i==alunoId) {
	    						flag = 0;
	    						System.out.println("Aluno ja cadastrado.");			    						break;
		    					}
		    				}
		    				if (flag == 1) {
		    					listaIdAlunos.add(alunoId);
		    				}
		    			}   			
		    			int numVagas = listaTurma.get(turmaId).getNumeroVagas();
		    			if ((listaIdAlunos.size() != listaAlunos.size()) && (listaIdAlunos.size() < numVagas)) {
			    			System.out.println("Deseja adicionar outro aluno? \n");
			    			System.out.println("0 - Nao\n");
							System.out.println("1 - Sim\n");
							System.out.println("Digite a opcao: \n");
							id = scan.nextLine();	
							op = Integer.parseInt(id);
		    			}
		    			else{
		    				op = 0;
		    				System.out.println("N�o existem mais alunos a serem cadastrados ou nao existem mais vagas.");
		    			}
	    		}while (op != 0);
	    		c.setlistaIdAlunos(listaIdAlunos);
	    		c.salvar("turma.txt", true);
	    		break;
	    	case 6:
	    		listaDisciplinas = d.getListaDisciplinas();
	    		listaTurma = c.getlistaTurmas();
	    		cont = 0;
	    		contTurmas = 0;
	    		for (Disciplina disciplina: listaDisciplinas){
	    			System.out.println(cont+1 + " - Nome: " + disciplina.getNome() +"\tEmenta: " + disciplina.getEmenta());
	    			cont ++;
	    		}
	    		System.out.println("\nInforme o numero da Disciplina: ");
	    		id = scan.nextLine();
	    		discId = (Integer.parseInt(id)) - 1;
	    		if ((discId < 0) || (discId > listaDisciplinas.size())){
	    			System.out.println("Numero incorreto.");
	    			break;
	    		}
	    		for(Turma turma: listaTurma){
	    			if (discId == turma.getIdDisciplina()){
	    				contTurmas ++;
	    			}
	    		}
	    		System.out.println("Numero de turmas ja oferecidas por esta disciplina: " + contTurmas);
	    		break;
	    	case 7:
	    		listaProfessores = b.getListaProfessores();
	    		listaTurma = c.getlistaTurmas();
	    		listaIdProfessores = new ArrayList<Integer>();
	    		cont = 0;
	    		
	    		for (Professor professor: listaProfessores){
	    			System.out.println(cont+1 + " - Nome: " + professor.getNome() +"\tDepartamento: " + professor.getDepartamento());
	    			cont ++;
	    		}
	    		System.out.println("\nInforme o numero do professor: ");
	    		id = scan.nextLine();
	    		profId = (Integer.parseInt(id)) - 1;
	    		if ((profId < 0) || (profId > listaProfessores.size())){
	    			System.out.println("Numero incorreto.");
	    			break;
	    		}
	    		contDisciplina = 0;
	    		for(Turma turma: listaTurma){
	    			listaIdProfessores = turma.getListaIdProfessores();
	    			for (int x: listaIdProfessores){
	    				if (profId == x){
	    					contDisciplina++;
	    				}
	    			}
	    		}
	    		System.out.println("Numero de disciplinas ja lecionadas por este professor: " + contDisciplina);
	    		break;
	    	}
		} while (op != 8); 
	}
}